/*
 * @Author: fumin 31408026@qq.com
 * @Date: 2025-01-XX
 * @Description: 微信H5网页授权工具类 (snsapi_base静默授权)
 */

/**
 * 微信H5网页授权工具类
 * 使用snsapi_base进行静默授权，只获取openid，无需用户确认
 */
class WechatAuth {
    constructor() {
        // 微信公众号AppID - 使用固定AppID值
        this.appId = 'wx1e43e7581744e421'

        // 授权回调地址 - 当前页面URL
        this.redirectUri = encodeURIComponent('https://kf.xj.189.cn/xcxchat/#/pages/login/login');

        // 授权作用域：snsapi_base（静默授权，只获取openid）
        this.scope = 'snsapi_base'
    }

    /**
     * 检测是否在微信环境
     */
    isWechat() {
        // #ifdef H5
        return /MicroMessenger/i.test(navigator.userAgent)
            // #endif

        // #ifndef H5
        return false
            // #endif
    }

    /**
     * 获取当前页面的完整URL（用于授权回调）
     */
    getCurrentUrl() {
        // #ifdef H5
        // 获取当前页面URL，去除code和state参数
        const url = new URL(window.location.href)
            // 移除可能存在的code和state参数
        url.searchParams.delete('code')
        url.searchParams.delete('state')
        return url.toString()
            // #endif

        // #ifndef H5
        return ''
            // #endif
    }

    /**
     * 从URL中获取授权code
     */
    getCodeFromUrl() {
        // #ifdef H5
        const urlParams = new URLSearchParams(window.location.search)
        console.log('urlParams', urlParams)
        return urlParams.get('code')
            // #endif

        // #ifndef H5
        return null
            // #endif
    }

    /**
     * 从URL中获取state参数
     */
    getStateFromUrl() {
        // #ifdef H5
        const urlParams = new URLSearchParams(window.location.search)
        return urlParams.get('state')
            // #endif

        // #ifndef H5
        return null
            // #endif
    }

    /**
     * 生成随机state参数（用于防止CSRF攻击）
     */
    generateState() {
        return Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15)
    }

    /**
     * 跳转到微信授权页面
     * @param {string} redirectUri - 授权回调地址，不传则使用当前页面URL
     * @param {string} state - 状态参数，用于防止CSRF攻击
     */
    redirectToAuth(redirectUri = null, state = null) {
        if (!this.isWechat()) {
            console.warn('非微信环境，无法进行微信授权')
            return false
        }

        // 设置回调地址
        this.redirectUri = redirectUri || this.getCurrentUrl()

        // 生成state参数
        const authState = state || this.generateState()

        // 保存state到sessionStorage，用于后续验证
        // #ifdef H5
        sessionStorage.setItem('wechat_auth_state', authState)
            // #endif

        // 构建微信授权URL
        const authUrl = `https://open.weixin.qq.com/connect/oauth2/authorize?appid=${this.appId}&redirect_uri=${encodeURIComponent(this.redirectUri)}&response_type=code&scope=${this.scope}&state=${authState}#wechat_redirect`

        console.log('跳转到微信授权页面:', authUrl)

        // 跳转到授权页面
        // #ifdef H5
        window.location.href = authUrl
            // #endif

        return true
    }

    /**
     * 验证state参数（防止CSRF攻击）
     */
    validateState(state) {
        // #ifdef H5
        const savedState = sessionStorage.getItem('wechat_auth_state')
        if (savedState && savedState === state) {
            // 验证成功后清除state
            sessionStorage.removeItem('wechat_auth_state')
            return true
        }
        return false
            // #endif

        // #ifndef H5
        return true
            // #endif
    }

    /**
     * 清除URL中的授权参数（code和state）
     */
    clearAuthParams() {
        // #ifdef H5
        const url = new URL(window.location.href)
        url.searchParams.delete('code')
        url.searchParams.delete('state')
        window.history.replaceState({}, '', url.toString())
            // #endif
    }

    /**
     * 初始化微信授权流程
     * @returns {Promise<Object>} 返回授权结果 {needAuth: boolean, code: string|null}
     */
    async initAuth() {
        // 1. 检查是否在微信环境
        if (!this.isWechat()) {
            console.log('非微信环境，跳过微信授权')
            return { needAuth: false, code: null, reason: 'not_wechat' }
        }

        // 2. 检查URL中是否已有code
        const code = this.getCodeFromUrl()
        const state = this.getStateFromUrl()

        if (code) {
            // 有code，验证state
            if (state && !this.validateState(state)) {
                console.error('State验证失败，可能存在CSRF攻击11111')
                return { needAuth: false, code: null, reason: 'invalid_state' }
            }

            // 验证通过，返回code
            return { needAuth: false, code, state }
        }

        // 3. 没有code，需要授权
        return { needAuth: true, code: null, state: null }
    }

    /**
     * 处理授权回调
     * @returns {Promise<Object>} 返回处理结果
     */
    async handleAuthCallback() {
        const code = this.getCodeFromUrl()
        const state = this.getStateFromUrl()

        if (!code) {
            return { success: false, message: '未获取到授权code' }
        }

        // 验证state
        if (state && !this.validateState(state)) {
            return { success: false, message: 'State验证失败' }
        }

        // 清除URL中的授权参数
        this.clearAuthParams()

        return { success: true, code, state }
    }
}

// 创建单例实例
const wechatAuth = new WechatAuth()

export default wechatAuth